﻿#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

/*深入理解指针3*/


/*
* 1.字符指针变量
*/
//int main()
//{
//	/*
//	* 相同的常量字符串去初始
//	  化不同的数组的时候就会开辟出不同的内存块
//	  所以str1和str2的地址不一样
//	*/
//	char str1[] = "hello,world!";
//	char str2[] = "hello,world!";
//
//	/*
//	* C/C++会把常量字符串存储到单独的⼀个内存区域，
//		当⼏个指针指向同⼀个字符串的时候，
//		他们实际会指向同⼀块内存。
//		所以str3和str4两者的地址一样
//	*/
//	char* str3 = "hello,world!";
//	char* str4 = "hello,world!";
//
//	if (str1== str2)
//	{
//		printf("str1 and str2 is sample\n");
//	}
//	else
//	{
//		printf("str1 and str2 is no sample\n");
//	}
//	printf("str1 %p ;\nstr2 %p ;\n",str1, str2);
//	if (str3 == str4)
//	{
//		printf("str3 and str4 is sample\n");
//	}
//	else
//	{
//		printf("str3 and str4 is no sample\n");
//	}
//	printf("str3 %p ;\nstr4 %p ;\n", str3, str4);
//	return 0;
//}

/*
* 2.数组指针变量//是指针变量
*  例：int (*a)[10];
* //由以下证明可知，二维数组传递时其实是以一维数组的指针进行传递的。不存在数组传递
*/
//void arr_text_zero(int arr[3][5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++) {
//			printf("arr[%d][%d]=%d\t",i,j, arr[i][j]);
//		}
//		printf("\n");
//	}
//}
//void arr_text_one(int (*p)[5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++) {
//			printf("arr[%d][%d]=%d\t", i, j, p[i][j]);
//			//printf("arr[%d][%d]=%d\t", i, j, *(*(p + i) + j));
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5},{7,8,9,4,5},{1,5,9,7,8} };
//	int r = sizeof(arr) / sizeof(arr[0]);//求第二维有多少个数据
//	int c = sizeof(arr[0]) / sizeof(arr[0][0]);//求第一维有多少个数据
//	printf("arr_text_zero(arr, r, c);\n");
//	arr_text_zero(arr, r, c);
//	printf("arr_text_one(arr, r, c);\n");
//	arr_text_one(arr, r, c);
//	return 0;
//}

/*
* 2.函数指针变量//是指针变量
*  例：
* 
*/
//void print(int max)
//{
//	for (int i = 0; i <= max; i++)
//	{
//		printf("%d\n",i);
//	}
//}
//
//
//int main()
//{
//	void (*p)(int max) = print;
//	//两种调用方都可以
//	p(10);//p代表存储的指针的地址
//	(*p)(5);
//	//*p代表存储的指针的地址指向的内容，其实还是地址
//	//因为print和&print都表示地址
//	printf("p=%p\n", p);
//	printf("&p=%p\n", &p);
//	printf("print=%p\n", print);
//	printf("&print=%p\n", &print);
//	return 0;
//}

/*
* 2. typedef关键字
* typedef是⽤来类型重命名的，可以将复杂的类型，简单化
*
*/

//void empty()
//{}
//
//int main()
//{
//	//数据类型重命名
//	typedef short uint16_t;
//	uint16_t i = 0;
//	//指针类型重命名
//	typedef int* ptr_t;
//	int a = 0;
//	ptr_t p1 = &a;
//	//数组指针重命名
//	int b[5] = { 0 };
//	typedef int(*parr_t)[5];
//	parr_t arr= &b;
//	//函数指针重命名
//	typedef void(*pfun_t)();
//	pfun_t fun= empty;
//	return 0;
//}



/*
* 2. 函数指针数组
* int (*parr1[3])();
* parr1 先和 [] 结合，说明parr1是数组，数组的内容是什么呢？
是 int (*)() 类型的函数指针
*使用示例
*/

int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}

//int main()
//{
//	int user = 0;
//	int x, y = 0;
//	do
//	{
//		printf("*************************\n");
//		printf(" 1:add\t\t2:sub \n");
//		printf(" 3:mul\t\t4:div \n");
//		printf(" 0:exit \n");
//		printf("*************************\n");
//		scanf("%d",&user);
//
//		switch (user)
//		{
//		case 1:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			printf("ret = %d\n", add(x, y));
//			
//			break;
//		case 2:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			printf("ret = %d\n", sub(x, y));
//			break;
//		case 3:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			printf("ret = %d\n", mul(x, y));
//			break;
//		case 4:
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			printf("ret = %d\n", div(x, y));
//			break;
//		case 0:
//			printf("退出程序");
//			break;
//		default:
//			printf("选择错误");
//			break;
//		}
//	} while (user);
//
//	return 0;
//}


int main()
{
	int user = 0;
	int x, y = 0;
	int(*p_fun[4])(int a, int b) = { add ,sub,mul,div};
	do
	{
		printf("*************************\n");
		printf(" 1:add\t\t2:sub \n");
		printf(" 3:mul\t\t4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		scanf("%d",&user);

		if (user==0)
		{

			printf("退出程序\n");
		}
		else if (user >= 1 && user <= 4)
		{
			printf("输入操作数：");
			scanf("%d %d", &x, &y);
			printf("ret = %d\n", p_fun[user-1](x, y));
		}
		else
		{
			printf("输入错误\n");

		}
	} while (user);

	return 0;
}